﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Office = Microsoft.Office.Core;
using Outlook = Microsoft.Office.Interop.Outlook;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ComunesMGI.Enum;
using ComunesMGI.Controles;
using OutlookMGI.Logica;
using Microsoft.Office.Interop.Outlook;
using ComunesMGI.Mensajes;


namespace OutlookMGI.Forms
{
    partial class IncidentesGUI
    {
        #region Form Region Factory

        [Microsoft.Office.Tools.Outlook.FormRegionMessageClass(Microsoft.Office.Tools.Outlook.FormRegionMessageClassAttribute.Note)]
        [Microsoft.Office.Tools.Outlook.FormRegionMessageClass("IPM.Note.IncidentesGUI")]
        [Microsoft.Office.Tools.Outlook.FormRegionName("OutlookMGI.IncidentesGUI")]
        public partial class IncidentesGUIFactory
        {
            // Occurs before the form region is initialized.
            // To prevent the form region from appearing, set e.Cancel to true.
            // Use e.OutlookItem to get a reference to the current Outlook item.
            private void IncidentesGUIFactory_FormRegionInitializing(object sender, Microsoft.Office.Tools.Outlook.FormRegionInitializingEventArgs e)
            {
            }
        }

        #endregion

        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;
        private TablaCamposControl _tablaCampos;

        // Occurs before the form region is displayed.
        // Use this.OutlookItem to get a reference to the current Outlook item.
        // Use this.OutlookFormRegion to get a reference to the form region.
        private void IncidentesGUI_FormRegionShowing(object sender, System.EventArgs e)
        {
            try
            {
                CargarClientes();
            }
            catch (System.Exception ex)
            {

                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();

            }
        }

        // Occurs when the form region is closed.
        // Use this.OutlookItem to get a reference to the current Outlook item.
        // Use this.OutlookFormRegion to get a reference to the form region.
        private void IncidentesGUI_FormRegionClosed(object sender, System.EventArgs e)
        {

        }

        private void CargarClientes()
        {
            List<DataCliente> ldc;
            ILogica il = LogicaFactory.GetInstance().GetILogica();
            ldc = il.GetClientes();
            if (ldc.Count > 0)
            {
                comboBoxClientes.Items.Clear();
                foreach (DataCliente dc in ldc)
                {
                    comboBoxClientes.Items.Add(dc.Nombre);
                }
                _clientes = ldc;
            }
        }

        private void CargarSistemas(DataCliente cliente)
        {
            bool confirm = true;
            if (buttonImpact.Enabled)
            {
                if (MessageBox.Show(
                    "Si cambia de cliente perderá la información ingresada, ¿está seguro?",
                    "Confirmar cambio de cliente",
                MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question) == DialogResult.No)
                    confirm = false;
                else
                {
                    buttonImpact.Enabled = false;
                    groupBox1.Enabled = false;
                    if (_tablaCampos != null)
                        _tablaCampos.Dispose();
                    groupBox1.Controls.Clear();
                }
            }

            if (confirm)
            {
                List<DataSistema> lds;
                ILogica il = LogicaFactory.GetInstance().GetILogica();
                lds = il.GetSistemas(cliente.Codigo);
                comboBoxSistemas.Items.Clear();
                comboBoxSistemas.Enabled = false;

                if (lds.Count > 0)
                {
                    foreach (DataSistema ds in lds)
                    {
                        comboBoxSistemas.Items.Add(ds.Nombre);
                    }
                    _sistemasDeCliente = lds;
                    comboBoxSistemas.Enabled = true;
                }
            }
        }
        private void comboBoxClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                CargarSistemas(_clientes.First(dc => dc.Nombre == comboBoxClientes.SelectedItem.ToString()));
            }
            catch (System.Exception ex)
            {
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }

        }

        private void comboBoxSistemas_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool confirm = true;
            try
            {
                if (buttonImpact.Enabled)
                {
                    if (MessageBox.Show(
                        "Si cambia de sistema perderá la información ingresada, ¿está seguro?",
                        "Confirmar cambio de sistema",
                    MessageBoxButtons.YesNo,
                        MessageBoxIcon.Question) == DialogResult.No)
                        confirm = false;
                }

                if (confirm)
                {
                    DataSistema actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                    ILogica il = LogicaFactory.GetInstance().GetILogica();
                    List<DataCampo> dataCampos = il.GetCampos(actualDs.Codigo, Lista.Incidentes);
                    if (dataCampos.Count > 0)
                    {
                        // busco si hay valores por defecto 
                        foreach (DataCampo dcTemp in dataCampos)
                        {
                            switch (dcTemp.ParteMail)
                            {
                                case ParteMail.FROM:
                                    dcTemp.Valor = ((MailItem)this.OutlookItem).SenderName;
                                    break;
                                case ParteMail.BODY:
                                    dcTemp.Valor = ((MailItem)this.OutlookItem).Body;
                                    break;
                                case ParteMail.DATE:
                                    dcTemp.Valor = ((MailItem)this.OutlookItem).ReceivedTime.ToString();
                                    break;
                                case ParteMail.SUBJECT:
                                    dcTemp.Valor = ((MailItem)this.OutlookItem).Subject;
                                    break;
                                case ParteMail.NINGUNO:
                                    break;
                                default:
                                    break;
                            }
                        }
                        _tablaCampos = new TablaCamposControl(dataCampos, errorProvider1);
                        groupBox1.Controls.Add(_tablaCampos);
                        buttonImpact.Enabled = true;
                        checkBoxAdjuntarCorreo.Enabled = true;
                    }
                }
            }
            catch (System.Exception ex)
            {
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void buttonImpactar_Click(object sender, EventArgs e)
        {
            try
            {
                this.ValidateChildren();
                if (_tablaCampos.validarCampos())
                {
                    ILogica il = LogicaFactory.GetInstance().GetILogica();
                    DataSistema actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                    actualDs.Campos = _tablaCampos.getCampos();
                    DataAltaIncidente dai;
                    // guardo el mail en un archivo temporal
                    if (checkBoxAdjuntarCorreo.Checked)
                    {
                        string filename = System.IO.Path.Combine(System.IO.Path.GetTempPath(), ((MailItem)this.OutlookItem).Subject + ".msg");
                        List<string> archivos = new List<string>();
                        archivos.Add(filename);
                        ((MailItem)this.OutlookItem).SaveAs(filename, OlSaveAsType.olMSG);
                        dai = il.AddIncidente(actualDs, archivos);
                        System.IO.File.Delete(filename);
                    }
                    else
                    {
                        dai = il.AddIncidente(actualDs, null);
                    }

                    Notificacion notif = new Notificacion("Nuevo Incidente Creado", "Se ha creado correctamente el nuevo Incidente.", "El nuevo Incidente se creo para el sistema " + comboBoxSistemas.Text + " del cliente " + comboBoxClientes.Text + " con identificador= " + dai.IdIncidente + " y URL= " + dai.Url);
                    notif.ShowDialog();

                    groupBox1.Controls.Clear();
                    comboBoxSistemas.Items.Clear();
                    buttonImpact.Enabled = false;
                    comboBoxSistemas.Enabled = false;
                    checkBoxAdjuntarCorreo.Enabled = false;
                    CargarClientes();
                }
                else
                {
                    Error err = new Error("Error", "Algunos campos contienen errores.", string.Empty);
                    err.ShowDialog();
                }
            }
            catch (System.Exception ex)
            {
                Error err = new Error("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }
    }
}
